//
//  my_map.hpp
//  封装map和set
//
//  Created by 卜绎皓 on 2022/11/17.
//

#pragma once
#include"RedBlackTree.hpp"
 
namespace Bernard
{
    template<class K, class V>
    class map
    {
        struct MapKeyOfT//定义map的仿函数内部类
        {
            //map的V类型为pair键值对
            const K& operator()(const pair<const K, V>& kv)
            {
                return kv.first;//返回pair中的第一个值
            }
        };
    public:
        typedef typename RBTree<K, pair<const K, V>, MapKeyOfT>::iterator iterator;
        iterator begin()
        {
            return _t.begin();
        }
        iterator end()
        {
            return _t.end();
        }
        pair<iterator, bool> insert(const pair<const K, V>& kv)
        {
            return _t.Insert(kv);
        }
        V& operator[](const K& key)
        {
            pair<iterator, bool> ret = insert(make_pair(key, V()));
            return ret.first->second;
        }
    private:
        RBTree<K, pair<const K, V>, MapKeyOfT> _t;
    };
}
